BlockingQueue(未完成)

BlockingQueue

第一节 概述

并发包 java.util.concurrent 提供了阻塞队列系列,顶层接口 BlockingQueue ,相关实现类:

  • ArrayBlockingQueue:基于数组的有界阻塞队列。
  • LinkedBlockingQueue:基于链表的阻塞队列。
  • DelayQueue:延迟队列。
  • SynchronousQueue:同步队列。
  • PriorityBlockingQueue:优先阻塞队列。

1. ArrayBlockingQueue

  • 定义: 基于数组实现的有界阻塞队列。
  • 特点:
    • 有界性: 容量固定,创建时必须指定大小。
    • 公平性: 可以设置公平性 (fairness) 策略,保证等待时间最长的线程优先获取队列中的元素。默认是非公平的。
    • 内部实现: 使用数组和两个 int 类型的索引 (takeIndex, putIndex) 来实现队列的循环。
  • 适用场景: 适用于生产者-消费者模式,且需要固定容量的场景。

2. LinkedBlockingQueue

  • 定义: 基于链表实现的阻塞队列。
  • 特点:
    • 容量可选: 可以指定容量,也可以不指定,不指定时容量为 Integer.MAX_VALUE,相当于无界队列。
    • 内部实现: 使用链表实现队列,头尾两个节点分别用于 take 和 put 操作。
  • 适用场景: 适用于生产者-消费者模式,容量不固定或需要较大容量的场景。

3. DelayQueue

  • 定义: 延迟队列,队列中的元素只有当其指定的延迟时间到了,才能从队列中获取到该元素。
  • 特点:
    • 无界性: 容量没有上限。
    • 优先级队列: 基于优先级队列实现,队列中的元素按照延迟时间排序,延迟时间最短的元素优先被取出。
    • 内部实现: 使用 PriorityQueue 实现。
  • 适用场景: 适用于需要延迟处理任务的场景,例如定时任务、缓存过期等。

4. SynchronousQueue

  • 定义: 同步队列,队列中每个 put 操作必须等待一个 take 操作,反之亦然。
  • 特点:
    • 不存储元素: 本身不存储任何元素,相当于一个传递器。
    • 高效: 由于不存储元素,因此 put 和 take 操作都非常快速。
    • 公平性: 可以设置公平性策略。
  • 适用场景: 适用于生产者-消费者模式,且生产者和消费者需要直接同步的场景,例如线程池。

5. PriorityBlockingQueue

  • 定义: 优先阻塞队列,队列中的元素按照优先级排序。
  • 特点:
    • 无界性: 容量没有上限。
    • 优先级排序: 元素按照优先级顺序出队,每次出队的元素都是优先级最高的元素。
    • 内部实现: 使用 PriorityQueue 实现。
  • 适用场景: 适用于需要按照优先级顺序处理任务的场景。